#ifndef _sdl_layer_h_
#define _sdl_layer_h_

#include <list>
#include <string>
#include <iostream>
#include "sdl_ptr.h"
#include "sdl_prim.h"
#include "sdl_debug.h"

/**
 * \brief Bazowa klasa reprezentująca uaktualniane zadanie lub wyświetlaną warstwę
 *
 * Nazwa "warstwa" może tutaj być myląca, ale jeżeli rozważymy, co może to słowo oznaczać, stanie się bardziej uprawniona. Silnik gry ma warstwy, cebula ma warstwy, ogry mają warstwy ;)
 * Możemy mieć warstwę wyświetlania sceny 3D. Możemy mieć warstwę wyświetlania modelu broni. Możemy mieć warstwę uaktualniania zdarzeń fizycznych. Możemy mieć warstwę wyświetlania HUD (Heads-Up Display - informacje o amunicji, życiu itd.).
 * Możemy mieć warstwę wyświetlania menu, warstwę dźwiękową, warstwę sieciową itd.
 * Zamiennie można to nazywać zadaniem. sdl_layer to bazowa klasa reprezentująca właśnie warstwę/zadanie. Podstawowym zadaniem zadania jest uaktualnienie się wraz z każdą iteracją pętli głównej :) Nasza konstrukcja pętli głównej (sdl_engine) będzie opierać się o polimorfizm. Wszelkiego rodzaju zadania będą dziedziczyć z sdl_layer, a następnie będą wtykane ( sdl_engine::add(sdl_layer *) ) w pętlę główną. Poprzez zadeklarowanie prototypu funkcji update() jako wirtualnego, mechanizm polimorfizmu zadba o wykonanie funkcji update() dla konkretnej klasy. Jeszcze jedna właściwość, którą posiada sdl_layer to sdl_layer::priority, czyli kolejność wykonania. Niektóre mechanizmy polegają na wykonaniu wcześniej innych zadań w danej iteracji pętli głównej. Dlatego dostarczamy operator <, który będzie używany do sortowania listy zadań względem zmiennej priority.
 *
 */

class sdl_layer : public sdl_prim,
depends<sdl_debug::debug> {
    friend std::ostream & operator<<(std::ostream & o, const sdl_layer & a);

    friend class sdl_engine;
    //friend bool operator<(const sdl_layer&,const sdl_layer&);
    friend bool operator<(const sdl_ptr<sdl_layer> &, const sdl_ptr<sdl_layer> &);
    ///lista zadań oczekujących na włożenie do engine
    static std::list<sdl_ptr<sdl_layer> > submitted_layers;
    ///priorytet (kolejność) zadania
    int priority;
    ///flaga wstrzymania zadania
    bool paused;

public:
    /**
     * \param _prior Priorytet (kolejność) zadania
     */
    sdl_layer(int, const std::string &);
    ///prototyp funkcji aktualizującej
    virtual void update();
    ///pauzowanie zadania
    void pause();
    ///wznowienie zadania
    void unpause();
    ///czy zadanie jest wstrzymane?
    bool is_paused();
};

///porównywanie do sortowania listy zadań
extern bool operator<(const sdl_ptr<sdl_layer> & a, const sdl_ptr<sdl_layer> & b);
///operator do pisania
extern std::ostream & operator<<(std::ostream & o, const sdl_layer & a);

#endif //_sdl_layer_h_

